package modelo;

import java.awt.Color;

import javax.media.opengl.GL;

import controle.Util;

/**
 * Classe que representa um c�rculo, sua representa��o baseia-se no ponto
 * central e o seu raio.
 * 
 * @author jean
 * @author diego
 */
public class Circulo extends ObjetoGrafico {

	private Ponto pontoCentro;
	private double raio;

	/**
	 * Cria um novo Círculo
	 * 
	 * @param pontoCentro
	 *            - O ponto do centro do círculo
	 * @param raio
	 *            - o raio
	 * @param cor
	 *            - a cor
	 */
	public Circulo(Ponto pontoCentro, double raio, Color cor) {
		super(cor);
		this.pontoCentro = pontoCentro;
		this.raio = raio;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void desenhar(GL gl) {
		// configurar cor de desenho (valores r, g, b)
		gl.glPointSize(2f);
		gl.glColor3f(getCor().getRed(), getCor().getGreen(), getCor().getBlue());
		// Desenhando o círculo
		double xTemp = 0;
		double yTemp = 0;
		double x = (float) Util.RetornaX((double) 0, raio) + pontoCentro.getX();
		double y = (float) Util.RetornaY((double) 0, raio) + pontoCentro.getY();
		gl.glBegin(GL.GL_LINES);
		gl.glVertex2d(x, y);

		recalcularBBox();

		for (int i = 5; i <= 360; i = i + 5) {
			x = Util.RetornaX((double) i, raio) + pontoCentro.getX();
			y = Util.RetornaY((double) i, raio) + pontoCentro.getY();
			xTemp = x;
			yTemp = y;
			gl.glVertex2d(x, y);
			gl.glVertex2d(xTemp, yTemp);
		}
		gl.glEnd();
		gl.glFlush();
	}

	private void recalcularBBox() {
		getbBox().recalcularBBox(
				new Ponto(pontoCentro.getX() + raio, pontoCentro.getY() + raio,
						pontoCentro.getZ(), pontoCentro.getW()));
		getbBox().recalcularBBox(
				new Ponto(pontoCentro.getX() + raio, pontoCentro.getY() - raio,
						pontoCentro.getZ(), pontoCentro.getW()));
		getbBox().recalcularBBox(
				new Ponto(pontoCentro.getX() - raio, pontoCentro.getY() + raio,
						pontoCentro.getZ(), pontoCentro.getW()));
		getbBox().recalcularBBox(
				new Ponto(pontoCentro.getX() - raio, pontoCentro.getY() - raio,
						pontoCentro.getZ(), pontoCentro.getW()));
	}

	/**
	 * Retorna o ponto no centro do círculo
	 * 
	 * @return the pontoCentro
	 */
	public Ponto getPontoCentro() {
		return pontoCentro;
	}

	/**
	 * Atribui o ponto do centro do círculo
	 * 
	 * @param pontoCentro
	 *            the pontoCentro to set
	 */
	public void setPontoCentro(Ponto pontoCentro) {
		this.pontoCentro = pontoCentro;
	}

	/**
	 * Retorn raiio
	 * 
	 * @return the raio
	 */
	public double getRaio() {
		return raio;
	}

	/**
	 * Atribui o raio
	 * 
	 * @param raio
	 *            the raio to set
	 */
	public void setRaio(double raio) {
		this.raio = raio;
	}

}
